package com.gep.session.impl;

import java.util.ArrayList;
import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.apache.log4j.Logger;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;
import org.hibernate.ejb.HibernateEntityManager;

import com.gep.dto.GrupoDTO;
import com.gep.entity.Grupo;
import com.gep.session.GrupoBORemota;
import com.gep.util.Conversor;

@Stateless(mappedName = "ejb/gep/GrupoBORemota")
public class GrupoBO implements GrupoBORemota {

	private static final Logger LOGGER = Logger.getLogger(GrupoBO.class);

	@PersistenceContext
	private EntityManager em;

	public List<GrupoDTO> buscarGrupos(GrupoDTO grupoDTO){
		List<GrupoDTO> gruposDto = new ArrayList<GrupoDTO>();
		List<Grupo> grupos;

		Grupo grupoBuscado = new Grupo();
		grupoBuscado = (Grupo) Conversor.converter(grupoDTO, grupoBuscado
				.getClass().getName());
		grupos = this.buscarGruposEntity(grupoBuscado);

		for (Grupo grupo : grupos) {

			GrupoDTO dto = (GrupoDTO) Conversor.converter(grupo, new GrupoDTO()
					.getClass().getName());
			gruposDto.add(dto);

		}

		return gruposDto;
	}

	@SuppressWarnings("unchecked")
	private List<Grupo> buscarGruposEntity(Grupo grupo) {
		Criteria criteria;
		List<Grupo> list;
		Session session;
		HibernateEntityManager hem;

		if (this.em instanceof HibernateEntityManager) {
			session = (Session) this.em.getDelegate();
		} else {
			hem = (HibernateEntityManager) this.em.getDelegate();
			session = hem.getSession();
		}

		criteria = session.createCriteria(Grupo.class);
		if (grupo.getCodGrupo() != null) {
			criteria.add(Restrictions.idEq(grupo.getCodGrupo()));
		}
		if (grupo.getNomeGrupo() != null) {
			if (grupo.getNomeGrupo().length() != 0) {
				criteria
						.add(Restrictions.eq("nomeGrupo", grupo.getNomeGrupo()));
			}
		}
		if (grupo.getCodGrupoEmp() != null) {
			if (grupo.getCodGrupoEmp().length() != 0) {
				criteria.add(Restrictions.eq("codGrupoEmp", grupo
						.getCodGrupoEmp()));
			}
		}
		list = criteria.list();
		return list;
	}

	public void apagarGrupo(GrupoDTO grupoDTO) {
		Grupo grupo = (Grupo) Conversor.converter(grupoDTO, new Grupo()
				.getClass().getName());
		grupo = em.find(grupo.getClass(), grupo.getCodGrupo());
		em.remove(grupo);
	}

	public void salvarGrupo(GrupoDTO grupoDTO){
		Grupo grupo = (Grupo) Conversor.converter(grupoDTO, new Grupo()
				.getClass().getName());
		if (grupo.getCodGrupo() == null) {
			this.em.persist(grupo);
		} else {
			this.em.merge(grupo);
		}

	}
}
